package com.cskaoyan.service;

import com.cskaoyan.bean.MarketRegion;
import com.cskaoyan.bean.MarketRegionExample;
import com.cskaoyan.bean.common.CommonData;
import com.cskaoyan.bean.vo.AdminRegionVo;
import com.cskaoyan.mapper.MarketRegionMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.LinkedList;
import java.util.List;

/**
 * @author yi
 * @date 2022/10/13 20:29
 */
@Service
public class AdminRegionServiceImpl implements AdminRegionService {
    @Autowired
    MarketRegionMapper marketRegionMapper;

    @Override
    public CommonData<AdminRegionVo> queryRegion(Integer page, Integer limit) {
        PageHelper.startPage(page, limit);

        // 创建一个AdminRegionVo实例，id为0，type为0，代表中国
        AdminRegionVo adminRegionVo = new AdminRegionVo();
        adminRegionVo.setId(0);
        adminRegionVo.setType((byte) 0);
        // 递归查找孩子并写入
        queryChildren(adminRegionVo);

        PageInfo<AdminRegionVo> adminRegionVoPageInfo = new PageInfo<>(adminRegionVo.getChildren());
        return CommonData.data(adminRegionVoPageInfo);
    }

    private void queryChildren(AdminRegionVo adminRegionVo) {
        // 到了区/县级别，停止往下查找区域
        if (adminRegionVo.getType() == 3) {
            return;
        }

        // 查找type比adminRegionVo的大1的，且pid为adminRegionVo的id的
        MarketRegionExample marketRegionExample = new MarketRegionExample();
        marketRegionExample.setOrderByClause("id");
        MarketRegionExample.Criteria criteria = marketRegionExample.createCriteria();
        criteria.andTypeEqualTo((byte) (adminRegionVo.getType() + 1));
        criteria.andPidEqualTo(adminRegionVo.getId());
        List<MarketRegion> marketRegions = marketRegionMapper.selectByExample(marketRegionExample);

        // 新建AdminRegionVo的list来接收递归查找到的下属区域
        List<AdminRegionVo> regionVos = new LinkedList<>();
        for (MarketRegion marketRegion : marketRegions) {
            AdminRegionVo adminRegionVoChild = regionBeanToVO(marketRegion);
            // 递归查找孩子
            queryChildren(adminRegionVoChild);
            regionVos.add(adminRegionVoChild);
        }
        // 将这个list作为Chindren
        adminRegionVo.setChildren(regionVos);
    }

    // 将MarketRegion对象中的属性赋给新建的AdminRegionVo对象并返回
    private AdminRegionVo regionBeanToVO(MarketRegion marketRegion) {
        AdminRegionVo adminRegionVo = new AdminRegionVo();
        adminRegionVo.setId(marketRegion.getId());
        adminRegionVo.setName(marketRegion.getName());
        adminRegionVo.setType(marketRegion.getType());
        adminRegionVo.setCode(marketRegion.getCode());
        return adminRegionVo;
    }
}
